橡樹資本管理公司共同創辦人 霍華德· 馬克司(Howard Marks)在著作《投資最重要的事》中提到:「成功投資不是因為買到好東西,而是因為東西買得好。」並認為以低於價值的價格買進最可靠,因為「買得好,就等於成功賣出一半」。
價值投資 是一種常見的投資策略,一言以蔽之,就是以 低於價值的價格買進,以更高的價格賣出。要做到這一點,就必須衡量證券的實質價值,所以價值投資之父 班傑明・葛拉漢 (Benjamin Graham)説:「內在價值是價值投資的前提。」而為了計算股票的內在價值,就產生出許多股票估值的方法。今天我們介紹市場上常用來評價股票的三種指標,也是在證交所及櫃買中心網站可以直接查到的數據,它們是「本益比」、「股價淨值比」以及「殖利率」。
本益比 是 P/E Ratio(Price-to-Earnings Ratio)是最常見的股票估值方式,它的計算方式是:
本益比 = 股價 / 每股盈餘
每股盈餘 是 EPS(Earnings Per Share)的意思是公司今年每股可以賺多少錢。本益比的意義就是代表當投資人買進股票後,經過多少年的時間可以回本。
本益比的計算的分母採用的是每股盈餘,因此本益比只適合用來評價獲利穩定的公司。如果公司獲利不穩定甚至正在虧損公司,就不適合採用本益比。此外,使用本益比估值時,需要考慮公司所屬的產業。產業不同,市場給予的本益比評價也不同。成長性越高的產業,市場會願意給出較高的本益比。
當公司不適合採用本益比評價時,另一種常見的估值方式是股價淨值比。股價淨值比 是 P/B Ratio(Price Book Ratio)又稱為 本淨比,它的計算方式是:
股價淨值比 = 股價 / 每股淨值
股價淨值比代表的意義是用多少成本可以購買公司 1 元的淨值。所以股價淨值比通常會使用 1 來評斷公司是否具有投資的價值。股價淨值比小於 1 時,代表股價被低估;股價淨值比大於 1 時,代表股價被高估。
殖利率(Dividend yield)也稱為 現金殖利率、股息殖利率。就像銀行存款存款有利息,殖利率就是把股票當成存款,把每年配發的現金股利當作利息來計算報酬率。它的計算方式是:
殖利率 = 每股現金股利 / 股價
嚴格來說,殖利率並不能作為一種嚴謹的股票評價方式,因為殖利率會受到該年度公司的股利政策所影響。不過「存股」是許多臺灣投資人喜歡的投資方式,透過累積持股,每年收取股息可以打造穩定的現金流。因此,如果公司的股利政策配得不錯,就容易吸引市場買盤進場,就是一般所說的「除權息行情」、「殖利率行情」。此外,基於殖利率選股,需要注意該公司是否能夠穩定「填息」。因為公司配發股息,股價會扣除現金股利,當股價漲回除息前的價格,就是填息。否則很可能賺了股息,卻賠了價差。
在證交所 個股日本益比、殖利率及股價淨值比(依日期查詢) 頁面,可以查詢上市公司日本益比、殖利率及股價淨值比。
證交所首頁 > 交易資訊 > 盤後資訊 > 個股日本益比、殖利率及股價淨值比(依日期查詢)
在「個股日本益比、殖利率及股價淨值比(依日期查詢)」頁面選取「查詢日期」,因為我們是要查詢所有產業的股票,在「分類項目」選擇「全部」,然後按下「查詢」後,就會列出該日的個股本益比、殖利率及股價淨值比。
點擊「列印 / HTML」連結,瀏覽器會開新分頁將資訊輸出成可列印的 HTML 頁面。假設資料日期為「民國 111 年 07 月 01 日」,我們會得到以下 URL:
https://www.twse.com.tw/exchangeReport/BWIBBU_d?response=html&date=20220701&selectType=ALL
以上 URL 可設定的參數如下:
response
:回應資料的格式。指定 html
輸出 HTML 文件;改為 csv
可以另存 CSV 檔案;設定成 json
或不指定則回應 JSON 格式資料。date
:資料日期。接受的日期格式為 yyyyMMdd
,如 20220701
。selectType
:分類項目。 ALL
表示分類項目是「全部」。我們將 URL 查詢參數改為 response=json&date=20220701&selectType=ALL
,證交所就會以 JSON 格式資料回應 2022 年 7 月 1 日的上市股票本益比、殖利率及股價淨值比等資訊:
{
"stat": "OK",
"date": "20220701",
"title": "111年07月01日 個股日本益比、殖利率及股價淨值比",
"fields": [
"證券代號",
"證券名稱",
"殖利率(%)",
"股利年度",
"本益比",
"股價淨值比",
"財報年/季"
],
"data": [
[
"1101",
"台泥",
"4.96",
110,
"14.06",
"1.19",
"111/1"
],
[
"1102",
"亞泥",
"7.69",
110,
"10.89",
"0.95",
"111/1"
],
[
"1103",
"嘉泥",
"3.62",
110,
"16.47",
"0.45",
"111/1"
],
......
],
"selectType": "ALL",
"notes": [
"說明: <font color=\"#E30000\" style=\"background-color: #FFFF00\"><b>本網頁資料僅供研究參考用途,任何資料均不應視為對買賣證券之投資建議。</b></font>\r\n本網頁資料推計基礎如下:\r\n1. 本益比 = 收盤價/每股參考稅後純益,其中每股參考稅後純益 = 該公司稅後參考純益/發行參考股數,當每股參考稅後純益為0或負數時,則不計算本益比。以上純益資料採用各上市公司於公開資訊觀測站過去已申報格式化之近滿4季財務報告為計算基礎。依據一般公認會計準則,若新設公司非於1月1日設立,該公司申報全年度合併財務報表採用自設立日起編製,未追溯自年初編製,當遇有上開公司在計算其「本益比」時,仍採用該公司申報資料計算。例如合庫金控(5880)於100年12月1日設立,在上市初期該公司「本益比」所採計之最近四季稅後純益為自成立以來迄至100年底之稅後純益計算,特此說明。 \r\n2. 殖利率 = 每股股利/收盤價*100%,其中每股股利採用該公司近期每股配發之盈餘分配之現金股利(元/股) + 法定盈餘公積、資本公積發放之現金 (元/股) + 盈餘轉增資股票股利(元/股)為計算基礎。 \r\n3. 股價淨值比 = 收盤價/每股參考淨值,其中每股參考淨值採用公開資訊觀測站公告之最近一季每股參考淨值,於102年5月中旬之前採用該公司最近一季淨值除以除權變動之採樣股數為推計基礎。\r\n4. 股利年度:計算殖利率,所採用上市公司於公開資訊觀測站公告之股利分派年度。(如股利年度為105,表示該公司以105年之盈餘分派股利)\r\n5. 財報年/季:計算本益比及股價淨值比,所參考上市公司於公開資訊觀測站申報之財務報告年度季別。\r\n6. 本網頁所採用發行參考股數是以公開資訊觀測站公告最近一季財務報表之淨值及每股參考淨值為推計基礎,於102年5月中旬之前採用除權變動之採樣股數為推計基礎。上市公司於公開資訊觀測站未申報格式化之財務報告或未齊全者,不計算本益比及股價淨值比或以其申報及相關資料推計。以上本網頁所採用之財務及股利相關資料為計算當時公開資訊觀測站已公告申報格式化之資料,而非同期即時資訊,且不作回溯計算,謹此說明。當日若無收盤價則以本公司營業細則第58-3條第2項第2款之原則所決定價格替代。\r\n7. 股利年度及財報年/季資訊自民國106年4月12日起提供。\r\n8. 股票名稱有附註「*」為每股面額非新台幣10元股票,其本益比、殖利率及股價淨值比之數值自面額變更換發新股即配合調整計算。"
]
}
到專案目錄開啟 src/scraper/twse-scraper.service.ts
檔案,在 TwseScraperService
實作 fetchEquitiesValues()
方法,取得上市股票本益比、殖利率及股價淨值比:
import * as _ from 'lodash';
import * as cheerio from 'cheerio';
import * as iconv from 'iconv-lite';
import * as numeral from 'numeral';
import { DateTime } from 'luxon';
import { firstValueFrom } from 'rxjs';
import { Injectable } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import { getTwseIndexSymbolByName } from '@speculator/common';
@Injectable()
export class TwseScraperService {
constructor(private httpService: HttpService) {}
...
async fetchEquitiesValues(date: string) {
// 將 `date` 轉換成 `yyyyMMdd` 格式
const formattedDate = DateTime.fromISO(date).toFormat('yyyyMMdd');
// 建立 URL 查詢參數
const query = new URLSearchParams({
response: 'json', // 指定回應格式為 JSON
date: formattedDate, // 指定資料日期
selectType: 'ALL', // 指定分類項目為全部
});
const url = `https://www.twse.com.tw/exchangeReport/BWIBBU_d?${query}`;
// 取得回應資料
const responseData = await firstValueFrom(this.httpService.get(url))
.then((response) => (response.data.stat === 'OK' ? response.data : null));
// 若該日期非交易日或尚無成交資訊則回傳 null
if (!responseData) return null;
// 整理回應資料
const data = responseData.data.reduce((tickers, row) => {
const [ symbol, name, dividendYield, dividendYear, peRatio, pbRatio, fiscalYearQuarter ] = row;
const ticker = {
date,
symbol,
name,
peRatio: numeral(peRatio).value(), // 本益比
pbRatio: numeral(pbRatio).value(), // 股價淨值比
dividendYield: numeral(dividendYield).value(), // 殖利率
dividendYear: numeral(dividendYear).value(), // 股利年度
};
return [ ...tickers, ticker ];
}, []);
return data;
}
}
在 fetchEquitiesValues()
方法中,需要指定 date
參數,表示要取得上市股票本益比、股價淨值比、殖利率的日期。我們定義回傳的型別是一個陣列,每個陣列元素代表一檔股票的物件,物件欄位包含如下:
date
:日期symbol
:股票代號name
:股票名稱peRatio
:本益比pbRatio
:股價淨值比dividendYield
:殖利率dividendYear
:股利年度完成後,我們只要呼叫 TwseScraperService
的 fetchEquitiesValues()
方法,就可以按日期取得上市股票本益比、股價淨值比、殖利率。以日期 2022-07-01
為例:
[
{
date: '2022-07-01',
symbol: '1101',
name: '台泥',
peRatio: 14.06,
pbRatio: 1.19,
dividendYield: 4.96,
dividendYear: 2021
},
{
date: '2022-07-01',
symbol: '1102',
name: '亞泥',
peRatio: 10.89,
pbRatio: 0.95,
dividendYield: 7.69,
dividendYear: 2021
},
{
date: '2022-07-01',
symbol: '1103',
name: '嘉泥',
peRatio: 16.47,
pbRatio: 0.45,
dividendYield: 3.62,
dividendYear: 2021
},
... 962 more items
]
在櫃買中心網站的 上櫃股票個股本益比、殖利率、股價淨值比(依日期查詢) 頁面,可以查詢上櫃公司日本益比、殖利率及股價淨值比。
櫃買中心首頁 > 上櫃 > 盤後資訊 > 個股本益比、殖利率及股價淨值比(依日期查詢)
在「上櫃股票個股本益比、殖利率、股價淨值比(依日期查詢)」頁面選取「資料日期」,「產業類別」選擇「全部產業」後,就會列出該日的個股本益比、殖利率及股價淨值比。
點擊「列印/匯出HTML」連結,瀏覽器會開新分頁將資訊輸出成可列印的 HTML 頁面。假設資料日期為「111/07/01」,我們會得到以下 URL:
https://www.tpex.org.tw/web/stock/aftertrading/peratio_analysis/pera_result.php?l=zh-tw&o=htm&d=111/07/01&c=&s=0,asc
以上 URL 可設定的參數如下:
l
:輸出資料的語系。zh-tw
為正體中文;en-us
為英文。o
:資料輸出的格式。指定 htm
表示輸出 HTML 文件;改為 csv
可以另存 CSV 檔案;設定成 json
或不指定則回應 JSON 格式資料。d
:資料日期。接受 民國年/月/日
的日期格式。需要注意,若 l
參數指定為 en-us
,則 d
參數需改成 西元年/月/日
的日期格式。c
:指定產業類別。未選擇代表「全部產業」。s
:指定欄位要依照升冪或降冪排序。例如 0,asc
是按代號升冪排序;1,desc
則按名稱降冪排序,依此類推。我們將 URL 查詢參數改為 l=zh-tw&o=htm&se=EW&t=D&d=111/07/01
,櫃買中心就會以 JSON 格式資料回應 2022 年 7 月 1 日的上櫃股票本益比、殖利率及股價淨值比等資訊:
{
"datetime": "111/07/01",
"iTotalRecords": 799,
"aaData": [
[
"1240",
"茂生農經",
"14.57",
"2.50000000",
110,
"5.70",
"1.23"
],
[
"1258",
"其祥-KY",
"10.31",
"0.00000000",
110,
"0.00",
"1.31"
],
[
"1259",
"安心",
"23.85",
"2.30000000",
110,
"3.41",
"1.09"
],
......
]
}
到專案目錄開啟 src/scraper/tpex-scraper.service.ts
檔案,在 TpexScraperService
實作 fetchEquitiesValues()
方法,取得上櫃股票本益比、股價淨值比、殖利率:
import * as _ from 'lodash';
import * as numeral from 'numeral';
import { DateTime } from 'luxon';
import { firstValueFrom } from 'rxjs';
import { Injectable } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import { Index, getTpexIndexSymbolByName, isWarrant } from '@speculator/common';
@Injectable()
export class TpexScraperService {
constructor(private httpService: HttpService) {}
...
async fetchEquitiesValues(date: string) {
// `date` 轉換成 `民國年/MM/dd` 格式
const dt = DateTime.fromISO(date);
const year = dt.get('year') - 1911;
const formattedDate = `${year}/${dt.toFormat('MM/dd')}`;
// 建立 URL 查詢參數
const query = new URLSearchParams({
l: 'zh-tw', // 指定語系為正體中文
o: 'json', // 指定回應格式為 JSON
d: formattedDate, // 指定資料日期
});
const url = `https://www.tpex.org.tw/web/stock/aftertrading/peratio_analysis/pera_result.php?${query}`;
// 取得回應資料
const responseData = await firstValueFrom(this.httpService.get(url))
.then((response) => response.data.iTotalRecords > 0 ? response.data : null);
// 若該日期非交易日或尚無成交資訊則回傳 null
if (!responseData) return null;
// 整理回應資料
const data = responseData.aaData.reduce((tickers, row) => {
const [ symbol, name, peRatio, dividendPerShare, dividendYear, dividendYield, pbRatio ] = row;
const ticker = {
date,
symbol,
name,
peRatio: numeral(peRatio).value(), // 本益比
pbRatio: numeral(pbRatio).value(), // 股價淨值比
dividendYield: numeral(dividendYield).value(), // 殖利率
dividendYear: dividendYear + 1911, // 股利年度
};
return [ ...tickers, ticker ];
}, []);
return data;
}
}
在 fetchEquitiesValues()
方法中,需要指定 date
參數,表示要取得上市股票本益比、股價淨值比、殖利率的日期。我們定義回傳的型別是一個陣列,每個陣列元素代表一檔股票的物件,物件欄位包含如下:
date
:日期symbol
:股票代號name
:股票名稱peRatio
:本益比pbRatio
:股價淨值比dividendYield
:殖利率dividendYear
:股利年度完成後,我們只要呼叫 TpexScraperService
的 fetchEquitiesValues()
方法,就可以按日期取得上櫃股票本益比、股價淨值比、殖利率。以日期 2022-07-01
為例:
[
{
date: '2022-07-01',
symbol: '1240',
name: '茂生農經',
peRatio: 14.57,
pbRatio: 1.23,
dividendYield: 5.7,
dividendYear: 2021
},
{
date: '2022-07-01',
symbol: '1258',
name: '其祥-KY',
peRatio: 10.31,
pbRatio: 1.31,
dividendYield: 0,
dividendYear: 2021
},
{
date: '2022-07-01',
symbol: '1259',
name: '安心',
peRatio: 23.85,
pbRatio: 1.09,
dividendYield: 3.41,
dividendYear: 2021
},
... 796 more items
]
本益比 = 股價 / 每股盈餘
。股價淨值比 = 股價 / 每股淨值
。殖利率 = 每股現金股利 / 股價
。
本系列文已正式出版為《Node.js 量化投資全攻略:從資料收集到自動化交易系統建構實戰》。本書新增了全新內容和實用範例,為你提供更深入的學習體驗!歡迎參考選購,開始你的量化投資之旅!
天瓏網路書店連結:https://www.tenlong.com.tw/products/9786263336070